package com.mashibing.dp.singleton;

/**
 * lazy loading * 也称懒汉式-线程不安全
 * 虽然达到了按需初始化的目的，但却带来线程不安全的问题：多线程访问有问题
 *
 */
public class Mgr03 {
    private static Mgr03 INSTANCE;// 这里不能加final，因为final必须初始化

    private Mgr03() {
    }

    public static Mgr03 getInstance() {
        if (INSTANCE == null) {
            // 测试线程：线程执行时速度太快，设置模拟睡眠时间
            try {
                Thread.sleep(1);// 被其他线程打断的几率增加了
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            /////////////////////////////////////////////////////////
            INSTANCE = new Mgr03();
        }
        return INSTANCE;
    }

    public void m() {
        System.out.println("m");
    }

    public static void main(String[] args) {
        // 方法三、方法中只有一句话，还可以简写，去掉大括号{}
        /*for(int i=0; i<100; i++) {
            new Thread(()->
                System.out.println(Mgr03.getInstance().hashCode())
            ).start();
        }*/
        // 方法二、java8 的 Lambda 表达式:没有名字的类的对象进行简化
        // 只有一个类可以简写，只有一个方法可以简写
        for(int i=0; i<100; i++) {
            // java8 的 Lambda 表达式:没有名字的类的对象进行简化：只有一个类只有一个实现方法
            new Thread(()->{
                System.out.println(Mgr03.getInstance().hashCode());// 同一个类的不同对象的hash码是不同的，不同的类的不同对象的hash码可能相同
                System.out.println(Mgr03.getInstance());// 不打印hash码，打印地址也行
            }).start();
        }
        // 方法一：匿名内部类
        /*for(int i=0; i<100; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println(Mgr03.getInstance().hashCode());
                }
            }).start();
        }*/
    }
}
